package com.buercorp.wangyu.Stream;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 在list集合和set集合
 * collect搜集方法
 * 把所有男性搜集起来
 * set集合会排重
 * @author liyiyu
 */
public class Test3 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "张三-男-23", "张三-男-23", "张三-男-23", "李四-男-22", "王五-女-21", "赵六-女-20", "李忆鱼-男-23");

        // 使用list集合收集collect不会去重
        List<String> newlist = list.stream()
                // split 分割
                .filter(s -> "男".equals(s.split("-")[1]))
                .collect(Collectors.toList());
        System.out.println(newlist); // [张三-男-23, 张三-男-23, 张三-男-23, 李四-男-22, 李忆鱼-男-23]

        // 使用set集合收集collect会去重
        Set<String> newset = list.stream()
                .filter(s -> "男".equals(s.split("-")[1]))
                .collect(Collectors.toSet());
        System.out.println(newset); // [李忆鱼-男-23, 张三-男-23, 李四-男-22]

        // 收集map集合
        // 谁作为键 谁作为值
        // 把所有男性收集起来 键：姓名 值：年龄
        ArrayList<String> list2 = new ArrayList<>();
        Collections.addAll(list2, "张三-男-23", "李四-男-22", "王五-女-21", "赵六-女-20", "李忆鱼-男-23");

        /**
         * toMap: 参数一表示键的生成规则
         *        参数二表示值的生成规则
         *
         * 参数一：
         *       Function泛型一：表示流中每一个数据的类型
         *               泛型二：表示Map集合中键的数据类型
         *       方法apply形参：依次表示流里面的每一个数据
         *             方法体：生成键的代码
         *             返回值：已经生成的键
         *
         *  参数二：
         *         Function泛型一：表示流中每一个数据的类型
         *                泛型二：表示Map集合中值的数据类型
         *         方法apply形参：依次表示流里面的每一个数据
         *              方法体：生成键的代码
         *              返回值：已经生成的键
         */
        Map<String,Integer> newmap = list2.stream()
                .filter(s -> "男".equals(s.split("-")[1]))
                .collect(Collectors.toMap(new Function<String, String>() {
                                              @Override
                                              public String apply(String s) {
                                                  return s.split("-")[0];
                                              }
                                          },
                        new Function<String, Integer>() {
                            @Override
                            public Integer apply(String s) {
                                return Integer.parseInt(s.split("-")[2]);
                            }
                        }

                ));

        System.out.println(newmap);

        Map<String,Integer> newmap2 = list2.stream()
                .filter(s -> "男".equals(s.split("-")[1]))
                .collect(Collectors.toMap(s -> s.split("-")[0],s -> Integer.parseInt(s.split("-")[2])));

        System.out.println(newmap2);

    }
}
